//============================================================================================
/**
 * @file	pkthln_shot_sub.c
 * @brief	サッカーサブ画面
 * @author	Nozomu Saito
 *
 * モジュール名：ShotSub_
 */
//============================================================================================
#include "pkthln_shot_sub.h"

#include "system/softsprite.h"
#include "system/arc_tool.h"
#include "system/gra_tool.h"
#include "system/clact_util_vram.h"
#include "system/fontproc.h"
#include "system/msgdata_util.h"
#include "system/wordset.h"
#include "system/snd_tool.h"
#include "../event_se_def.h"
#include "poketool/poke_tool.h"

#include "shot_obj_pri.h"
#include "../pkthln_act_def.h"
#include "../../poke_clact.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_pokethlon.h"

#include "pkthev_shot.naix"

#define MSG_BG	(GF_BGL_FRAME0_S)

#define	SHOT_SYS_FONT_PAL	(15)
#define	BAGCOL_N_WHITE	( GF_PRINTCOLOR_MAKE( 15, 14, 0 ) )		// フォントカラー：白

#define SCORE_NUMBER_W	(4)			//得点用数字横キャラ幅
#define SCORE_NUMBER_H	(8)			//得点用数字縦キャラ幅
#define SCORE_DIGI_MAX	(2)			//得点は最大2桁
#define SCORE_DISP_START_X	(6)		//得点描画開始X位置（キャラ）
#define SCORE_DISP_START_Y	(10)	//得点描画開始Y位置（キャラ）
#define NUMBER_SCR_NUM_W	(5)		//数字スクリーンデータの横の数字の数0〜4	スクリーンデータに依存
#define NUMBER_SCR_NUM_H	(2)		//数字スクリーンデータの縦の数字の数5〜9	スクリーンデータに依存

#define WATCH_ACT_POS_X	(22*8)
#define TIMER_ACT_POS_X	(24*8)
#define TIMER_ACT_POS_Y	(16*8)

#define FLAG_ACT_POS_X	(7*8-2)
#define FLAG_ACT_POS_Y	(19*8)

#define WATCH_ANM_OFS	(5)


typedef struct SHOT_SUB_DISP_CNT_tag
{
	int HeapID;
	PKTHLN_PTR PkthlnPtr;		//ポケスロンポインタ	これで、マイステータスとかにアクセスする
	CLACT_WORK_PTR	TimeNumActPtr[TIMER_ACT_NUM];	//秒2桁
	GF_BGL_INI * Bgl;
	GF_BGL_BMPWIN	Win;			// BMPウィンドウデータ
	GF_BGL_BMPWIN	Win2;			// BMPウィンドウデータ
	MSGDATA_MANAGER* MsgMan;
	WORDSET * Wset;
	NNSG2dScreenData *PointScrnData;

	void *PointBgArc;
	int DispScore;
	int disp_flg;
	PKTHLN_ACT_PTR WatchActPtr;

}SHOT_SUB_DISP_CNT;

#define WIN_NAME1_PX	(8)
#define WIN_NAME1_PY	(18)
#define WIN_NAME_SX		(10)
#define WIN_NAME_SY		(2)
#define WIN_NAME_SIZE	( WIN_NAME_SX * WIN_NAME_SY )

#define WIN_LAST_PX	(19)
#define WIN_LAST_PY	(14)
#define WIN_LAST_SX		(10)
#define WIN_LAST_SY		(4)
#define WIN_LAST_SIZE	( WIN_LAST_SX * WIN_LAST_SY )


#define FONT_PAL	(SHOT_SYS_FONT_PAL)
#define WIN_CGX_BASE	(1)
#define WIN_NAME1_CGX	(WIN_CGX_BASE)
#define WIN_LAST_CGX	(WIN_NAME1_CGX + WIN_NAME_SIZE)

#define WIN_NAME2_CGX	(WIN_NAME1_CGX + WIN_NAME_SIZE )
#define WIN_NAME3_CGX	(WIN_NAME2_CGX + WIN_NAME_SIZE )
#define WIN_NAME4_CGX	(WIN_NAME3_CGX + WIN_NAME_SIZE )

static void CreateBmpWin( SHOT_SUB_DISP_CNT_PTR ptr );

static const BMPWIN_DAT ShotEvtBmpData =
{
	//トレーナー名
	MSG_BG, WIN_NAME1_PX, WIN_NAME1_PY,
	WIN_NAME_SX, WIN_NAME_SY, FONT_PAL, WIN_NAME1_CGX
};

static const BMPWIN_DAT ShotEvtBmpData2 =
{
	//ラストスパート
	MSG_BG, WIN_LAST_PX, WIN_LAST_PY,
	WIN_LAST_SX, WIN_LAST_SY, FONT_PAL, WIN_LAST_CGX
};

//タイマーアクターアニメ番号（セルアニメデータ依存）
static const u8 DefaultTimerActAnm[TIMER_ACT_NUM] = {
	1,1,
};

//タイマーアクターX座標
static const u8 TimerActPosX[TIMER_ACT_NUM] = {
	TIMER_ACT_POS_X, TIMER_ACT_POS_X+(8*2),
};

static void WriteWinLastMsg( SHOT_SUB_DISP_CNT_PTR ptr );

//----------------------------------------------------------------------------
/**
 *	@brief	初期化
 *
 *	@param	inHeapID	ヒープＩＤ
 *	@param	*inBgl		BGL
 *	@param	pkthlnPtr 	ポケスロンポインタ
 *
 *	@return	コントローラポインタ
 */
//-----------------------------------------------------------------------------
SHOT_SUB_DISP_CNT_PTR ShotSub_Init( const int inHeapID, GF_BGL_INI *inBgl, PKTHLN_PTR pkthlnPtr )
{
	SHOT_SUB_DISP_CNT_PTR ptr;
	int size;
	size = sizeof(SHOT_SUB_DISP_CNT);

	ptr = sys_AllocMemory( inHeapID, size );
	MI_CpuClear8( ptr, size);

	ptr->HeapID = inHeapID;

	ptr->Bgl = inBgl;

	ptr->PkthlnPtr = pkthlnPtr;

	//BMP
	CreateBmpWin(ptr);

	//メッセージマネージャ
	//アーカイブから展開して表示
    ptr->MsgMan = MSGMAN_Create(MSGMAN_TYPE_DIRECT, ARC_MSG, NARC_msg_pokethlon_dat, inHeapID);
	//ワードセット
	ptr->Wset = WORDSET_Create( inHeapID );

	return ptr;
}


//----------------------------------------------------------------------------
/**
 *	@brief	解放
 *
 *	@param	ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_Free(SHOT_SUB_DISP_CNT_PTR ptr)
{
	sys_FreeMemoryEz(ptr->PointBgArc);

	//ワードセット
	WORDSET_Delete(ptr->Wset);
	//メッセージマネージャ
	MSGMAN_Delete(ptr->MsgMan);

	//BMP
	GF_BGL_BmpWinDel( &ptr->Win );
	GF_BGL_BmpWinDel( &ptr->Win2 );

	sys_FreeMemoryEz(ptr);
}

//----------------------------------------------------------------------------
/**
 *	@brief		スクリーンセット
 *
 *	@param	ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_SetScreen(SHOT_SUB_DISP_CNT_PTR ptr)
{
	ArcUtil_ScrnSet(ARC_PKTHEV_SHOT, NARC_pkthev_shot_shot_bg_sub01_nscr,
						ptr->Bgl, GF_BGL_FRAME1_S, 0, 0, FALSE, ptr->HeapID);

	ArcUtil_ScrnSet(ARC_PKTHEV_SHOT, NARC_pkthev_shot_shot_bg_sub03_nscr,
						ptr->Bgl, GF_BGL_FRAME2_S, 0, 0, FALSE, ptr->HeapID);

	ptr->PointBgArc = ArcUtil_ScrnDataGet(ARC_PKTHEV_SHOT, NARC_pkthev_shot_shot_bg_sub_point_nscr,
						FALSE, &ptr->PointScrnData, ptr->HeapID);

	//得点初回フィル
	ShotSub_FillPoint(ptr, 0);
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケモン以外のＯＢＪセット
 *
 *	@param	inActCntPtr	アクターコントローラポインタ
 *	@param	ptr			コントローラポインタ
 *	@param	cmn_res_ptr	共通リソースポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_SetObj(PKTHLN_CLACT_CNT_PTR inActCntPtr, SHOT_SUB_DISP_CNT_PTR ptr, CMN_RES_CNT_PTR cmn_res_ptr)
{
	u8 i;
	PKTHLN_ACT_PTR flag_act_ptr;
	PKTHLN_ACT_PTR watch_act_ptr;

	VecFx32 flag_vec = {FLAG_ACT_POS_X*FX32_ONE, SUB_DISP_DISTANCE + FLAG_ACT_POS_Y*FX32_ONE, 0};
	VecFx32 watch_vec = {WATCH_ACT_POS_X*FX32_ONE, SUB_DISP_DISTANCE + TIMER_ACT_POS_Y*FX32_ONE, 0};

	//旗
	flag_act_ptr = PkthlnClAct_SetGetActor(inActCntPtr, 0,
				NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_SHOT_SUB, ACT_CODE_SHOT_FLAG);
	PkthlnClAct_SetActive(flag_act_ptr, TRUE, TRUE);		//表示
	PkthlnClAct_SetPos(flag_act_ptr, &flag_vec);
	PkthlnClAct_ChgAnm(flag_act_ptr, 1+PTFrameGetCurrentID(ptr->PkthlnPtr));

	//時計
	watch_act_ptr = PkthlnClAct_SetGetActor(inActCntPtr, 0,
				NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_SHOT_SUB, ACT_CODE_SHOT_WATCH);
	PkthlnClAct_SetActive(watch_act_ptr, TRUE, TRUE);		//表示
	PkthlnClAct_SetPos(watch_act_ptr, &watch_vec);
	PkthlnClAct_ChgAnm(watch_act_ptr, WATCH_ANM_OFS);

	ptr->WatchActPtr = watch_act_ptr;

	//共有リソースからアクター取得
	for(i=0;i<TIMER_ACT_NUM;i++){
		VecFx32 vec;
		ptr->TimeNumActPtr[i] = CmnRes_CreateF2X2SubAct( cmn_res_ptr,
														  PkthlnClAct_GetClActSetAdr(inActCntPtr),
														  0,
														  ptr->HeapID );
		CLACT_SetDrawFlag(ptr->TimeNumActPtr[i], 1);	//表示

		vec.x = TimerActPosX[i] * FX32_ONE;
		vec.y = SUB_DISP_DISTANCE + TIMER_ACT_POS_Y * FX32_ONE;
		vec.z = 0;
		//タイマーアクターの座標セット
		CLACT_SetMatrix(ptr->TimeNumActPtr[i], &vec);
		CLACT_AnmChg(ptr->TimeNumActPtr[i], DefaultTimerActAnm[i]);
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 情報表示
 *
 * @param	ptr		管理ポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ShotSub_WriteWinInfo( SHOT_SUB_DISP_CNT_PTR ptr )
{
	u8 i;
	GF_BGL_BmpWinDataFill( &ptr->Win, 0);

	//名前
	{
		u8 win_cnt;
		u8 my_id;
		//第一枠は必ず自分の名前
		STRBUF *name_buf;

		my_id = PTFrameGetCurrentID(ptr->PkthlnPtr);
		//マイステータスにアクセスして名前取得
		name_buf = MyStatus_CreateNameString(
				PTFrame_GetMyStatus(ptr->PkthlnPtr, my_id),
				ptr->HeapID);
		GF_STR_PrintColor( 	&ptr->Win, FONT_SYSTEM, name_buf,
				0, 0, MSG_NO_PUT, BAGCOL_N_WHITE, NULL );
		STRBUF_Delete(name_buf);
	}

	GF_BGL_BmpWinOn(&ptr->Win);
}

//--------------------------------------------------------------------------------------------
/**
 * 情報表示2
 *
 * @param	ptr		管理ポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void WriteWinLastMsg( SHOT_SUB_DISP_CNT_PTR ptr )
{
	u8 i;
	GF_BGL_BmpWinDataFill( &ptr->Win2, 0);

	{
		STRBUF *buf;
		buf = MSGDAT_UTIL_AllocExpandString(ptr->Wset, ptr->MsgMan, msg_pkthln_shot_last, ptr->HeapID);

		GF_STR_PrintColor( 	&ptr->Win2, FONT_SYSTEM, buf,
				0, 0, MSG_NO_PUT, BAGCOL_N_WHITE, NULL );
		STRBUF_Delete(buf);
	}

	GF_BGL_BmpWinOn(&ptr->Win2);
}

//--------------------------------------------------------------------------------------------
/**
 * BMPウィンドウ追加
 *
 * @param 	ptr			コントローラポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void CreateBmpWin( SHOT_SUB_DISP_CNT_PTR ptr )
{
	const BMPWIN_DAT * dat = &ShotEvtBmpData;
	const BMPWIN_DAT * dat2 = &ShotEvtBmpData2;
	GF_BGL_BmpWinAddEx( ptr->Bgl, &(ptr->Win), dat );
	GF_BGL_BmpWinAddEx( ptr->Bgl, &(ptr->Win2), dat2 );

	//先頭キャラをクリア（スクリーンクリアされてるところは、このキャラで埋まる）
	GF_BGL_CharFill( ptr->Bgl, MSG_BG, 0, 1, 0 );

	//会話ウィンドウ用リソース展開
///	TalkWinGraphicSet(bgl,MSG_BG,
///		TALKWIN_CGX, TALKWIN_PAL, wk->win_type, inHeapID);
	//システム用フォントパレット転送
	SystemFontPaletteLoad(PALTYPE_SUB_BG, SHOT_SYS_FONT_PAL*32, ptr->HeapID);
}

//----------------------------------------------------------------------------
/**
 *	@brief	得点書き換えメイン
 *
 *	@param	ptr		コントローラポインタ
 *	@param	inScore	スコア
 *	@param	inNetID　ネットＩＤ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_ScoreUpdate(SHOT_SUB_DISP_CNT_PTR ptr, u8 inScore, u8 inNetID)
{
	//受け取ったデータは自分の得点かをチェック
	if (inNetID != PTFrameGetCurrentID(ptr->PkthlnPtr)){
		//自分の得点ではないので、処理終了
		return;
	}

	//現在表示している得点と差異があるか
	if (ptr->DispScore != inScore){
		//書き換え
		ptr->DispScore = inScore;
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	表示得点取得
 *
 *	@param	ptr		コントローラポインタ
 *
 *	@return	score	スコア
 */
//-----------------------------------------------------------------------------
u8 ShotSub_GetDispScore(SHOT_SUB_DISP_CNT_PTR ptr)
{
	return 	ptr->DispScore;
}

//----------------------------------------------------------------------------
/**
 *	@brief	タイマー表示
 *
 *	@param	ptr	コントローラポインタ
 *	@param	inTime
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_DispTime(SHOT_SUB_DISP_CNT_PTR ptr, const int inTime)
{
	u8 sec, sec_t, sec_o;

	//ローカル30秒前は時間を非表示
	if ( inTime <= 30*30 ){
		CLACT_SetDrawFlag(ptr->TimeNumActPtr[0], 0);	//非表示
		CLACT_SetDrawFlag(ptr->TimeNumActPtr[1], 0);	//非表示
		PkthlnClAct_SetActive(ptr->WatchActPtr, TRUE, FALSE);		//非表示

		if (ptr->disp_flg == 0){
			WriteWinLastMsg(ptr);
			ptr->disp_flg = 1;
		}
		return ;
	}

	//秒計算
	sec = inTime / 30;

	//十の位
	sec_t = sec/10;
	//一の位
	sec_o = sec % 10;

	//秒を書き換え
	CLACT_AnmChg(ptr->TimeNumActPtr[0], sec_t+1);
	CLACT_AnmChg(ptr->TimeNumActPtr[1], sec_o+1);
}

//----------------------------------------------------------------------------
/**
 *	@brief	得点フィル
 *
 *	@param	ptr	コントローラポインタ
 *	@param	inPoint	得点
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ShotSub_FillPoint(SHOT_SUB_DISP_CNT_PTR cnt_ptr, const u8 inPoint)
{
	u8 i;
	u8 t,o;
	u8 read_x[SCORE_DIGI_MAX];
	u8 read_y[SCORE_DIGI_MAX];

	//2桁の点数を2つに分解
	t = inPoint / 10;
	o = inPoint % 10;

	//データ読み込み位置を算出(数字スクリーンデータに依存)
	read_x[0] = (t%NUMBER_SCR_NUM_W)*SCORE_NUMBER_W;
	read_y[0] = (t/NUMBER_SCR_NUM_W)*SCORE_NUMBER_H;
	read_x[1] = (o%NUMBER_SCR_NUM_W)*SCORE_NUMBER_W;
	read_y[1] = (o/NUMBER_SCR_NUM_W)*SCORE_NUMBER_H;


	for (i=0;i<SCORE_DIGI_MAX;i++){
		GF_BGL_ScrWriteFree(cnt_ptr->Bgl, GF_BGL_FRAME2_S,
				SCORE_DISP_START_X+(i*SCORE_NUMBER_W), SCORE_DISP_START_Y,
				SCORE_NUMBER_W, SCORE_NUMBER_H,
				&cnt_ptr->PointScrnData->rawData,
				read_x[i], read_y[i], SCORE_NUMBER_W*NUMBER_SCR_NUM_W, SCORE_NUMBER_H*NUMBER_SCR_NUM_H );
	}
	GF_BGL_LoadScreenV_Req(cnt_ptr->Bgl, GF_BGL_FRAME2_S);
}